/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dataBase;

import Services.AppService;
import Services.UsuarioService.UsuarioService;
import exeptions.GeneralException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import mapeos.Archivo;
import mapeos.Grupo;
import mapeos.Tipoarchivo;
import mapeos.Usuario;
import utils.ArchUtils;

/**
 *
 * @author ivanpianetti
 */
public class ScriptDatosDB {

    private static Archivo carpetaActual;
    private static Usuario usuarioActual;
    private static List<Archivo> listaArchivosDeCarpeta;
    private static List<Usuario> listaUsuariosExistentes;

    /**
     *
     * @param args the command line arguments
     */
    public static void main(String[] args) throws GeneralException {
        try {
            System.out.println("#Ingrese a continuacion una opcion para realizar en la base de datos PandoraBox:");
            System.out.println("1- Cargar tablas y archivos predeterminados");
            System.out.println("2- LogIn y Operaciones");
            System.out.println("=>");
            int unaOpc = Integer.parseInt(ScriptDatosDB.getOpcion());
            switch (unaOpc) {
                case 1: {
                    HibernateUtil.deletAllData();

                    //TIPO ARCHIVO
                    Tipoarchivo tipoArchivo0 = new Tipoarchivo(ArchUtils.tipoCarpeta);
                    Tipoarchivo tipoArchivo1 = new Tipoarchivo(ArchUtils.tipoImagen);
                    Tipoarchivo tipoArchivo2 = new Tipoarchivo(ArchUtils.tipoDocumento);
                    Tipoarchivo tipoArchivo3 = new Tipoarchivo(ArchUtils.tipoAudio);
                    Tipoarchivo tipoArchivo4 = new Tipoarchivo(ArchUtils.tipoVideo);
                    Tipoarchivo tipoArchivo5 = new Tipoarchivo(ArchUtils.tipoOtro);
                    Tipoarchivo tipoArchivo6 = new Tipoarchivo(ArchUtils.tipoComprimido);
                    Tipoarchivo tipoArchivo7 = new Tipoarchivo(ArchUtils.tipoPresentacion);

                    AppService.getInstance().getTipoArchivoService().insert(tipoArchivo0);
                    AppService.getInstance().getTipoArchivoService().insert(tipoArchivo1);
                    AppService.getInstance().getTipoArchivoService().insert(tipoArchivo2);
                    AppService.getInstance().getTipoArchivoService().insert(tipoArchivo3);
                    AppService.getInstance().getTipoArchivoService().insert(tipoArchivo4);
                    AppService.getInstance().getTipoArchivoService().insert(tipoArchivo5);
                    AppService.getInstance().getTipoArchivoService().insert(tipoArchivo6);
                    AppService.getInstance().getTipoArchivoService().insert(tipoArchivo7);

                    //#USUARIOS
                    Usuario user0 = new Usuario("Ivan Pianetti", "bipiane", "12345", "IvanPianetti23@gmail.com");
                    Usuario user1 = new Usuario("Debora Farías", "chuchy", "12345", "DeboraFa88@gmail.com");
                    Usuario user2 = new Usuario("Matias Borges", "uru", "12345", "msba87@gmail.com");
                    Usuario user3 = new Usuario("Sebastian de la Cruz", "sebas", "12345", "sedelacruz@gmail.com");

                    Services.AppService.getInstance().getUsuarioService().insert(user0);
                    Services.AppService.getInstance().getUsuarioService().insert(user1);
                    Services.AppService.getInstance().getUsuarioService().insert(user2);
                    Services.AppService.getInstance().getUsuarioService().insert(user3);

                    //#LOGIN
                    usuarioActual = AppService.getInstance().getUsuarioService().logIn("bipiane", "12345");
                    if (usuarioActual != null & usuarioActual.getUsuarioUsuario() != null) {
                        System.out.println("Usuario " + usuarioActual.getNombreUsuario() + " se logeo correctamente!");
                    }

                    //#GRUPO
                    List<Grupo> listaGruposDeUsuario = AppService.getInstance().getGrupoService().getAllByUsuario(usuarioActual);
                    System.out.println("El Usuario " + usuarioActual.getNombreUsuario() + " posee " + listaGruposDeUsuario.size() + " Grupos");

                    //#CARPETA HOME
                    carpetaActual = AppService.getInstance().getArchivoService().getCarpetaHomeByUsuario(usuarioActual);

                    //#USUARIOS
                    ScriptDatosDB.listarUsariosDeCarpeta(carpetaActual);

                    //CARGA DE ARCHIVOS
                    ScriptDatosDB.cargarArchivos();

                    //#ARCHIVOS
                    List<Archivo> listaArchivosDeUsuario = AppService.getInstance().getArchivoService().getAllByUsuario(usuarioActual);
                    System.out.println("Cantidad de Archivos del Usuario: " + usuarioActual.getNombreUsuario() + " -> " + listaArchivosDeUsuario.size());

                    ScriptDatosDB.listarArchivosDeCarpeta(carpetaActual);

                    break;
                }
                case 2: {
                    ScriptDatosDB.listarUsuariosExistentes();
                    System.out.println("#LOG IN");
                    System.out.println("-Nombre de Usuario \n =>");
                    String nombreUser = ScriptDatosDB.getOpcion();
                    System.out.println("-Clave \n =>");
                    String claveUser = ScriptDatosDB.getOpcion();

                    usuarioActual = AppService.getInstance().getUsuarioService().logIn(nombreUser, claveUser);
                    if (usuarioActual != null) {
                        System.out.println("\n" + usuarioActual.getNombreUsuario() + " logeado correctamente!");
                    } else {
                        System.out.println("Clave o nombre de usuario incorrecto");
                        break;
                    }
                    carpetaActual = AppService.getInstance().getArchivoService().getCarpetaHomeByUsuario(usuarioActual);
                    do {
                        System.out.println("\n#Ingrese una operación para realizar");
                        System.out.println("0- SALIR");
                        System.out.println("1- listar Archivos carpeta");
                        System.out.println("2- Ingresar a carpeta");
                        System.out.println("3- Nueva carpeta");
                        System.out.println("4- Compartir carpeta");
                        System.out.println("5- Borrar archivo o carpeta");
                        System.out.println("6- Subir Archivo");
                        System.out.println("7- Descargar Archivo");
                        System.out.println("8- Editar archivo");
                        System.out.println("9- listar Usuarios carpeta actual");
                        System.out.println("10- Salir de carpeta compartida");
                        System.out.println("\n");
                        unaOpc = Integer.parseInt(ScriptDatosDB.getOpcion());
                        switch (unaOpc) {
                            case 1: {
                                ScriptDatosDB.listarArchivosDeCarpeta(carpetaActual);
                                break;
                            }
                            case 2: {//Ingresar a Carpeta ok
                                ScriptDatosDB.listarArchivosDeCarpeta(carpetaActual);
                                System.out.println("#Ingrese el numero de la carpeta para ingresar");
                                unaOpc = Integer.parseInt(ScriptDatosDB.getOpcion());
                                Archivo arch = listaArchivosDeCarpeta.get(unaOpc - 1);
                                if (arch.isCarpeta()) {
                                    carpetaActual = arch;
                                }
                                ScriptDatosDB.listarArchivosDeCarpeta(carpetaActual);
                                break;
                            }
                            case 3: {//Nueva Carpeta ok
                                String nombreMadre = carpetaActual.getNombreArchivo();
                                carpetaActual.setNombreArchivo("Nueva Carpeta");
                                AppService.getInstance().getArchivoService().crearCarpeta(carpetaActual);
                                ScriptDatosDB.listarArchivosDeCarpeta(carpetaActual);
                                carpetaActual.setNombreArchivo(nombreMadre);
                                break;
                            }
                            case 4: {//Compartir Carpeta ok
                                ScriptDatosDB.listarUsuariosExistentes();
                                System.out.println("#Ingrese el numero de usuario para compartir carpeta actual");
                                unaOpc = Integer.parseInt(ScriptDatosDB.getOpcion());
                                Usuario user = listaUsuariosExistentes.get(unaOpc - 1);
                                AppService.getInstance().getArchivoService().compartirCarpeta(carpetaActual, user);
                                break;
                            }
                            case 5: {//Borrar Archivo ok
                                break;
                            }
                            case 6: {//Subir Archivo ok
                                ScriptDatosDB.cargarArchivos();
                                break;
                            }
                            case 7: {//Descargar Archivo
                                ScriptDatosDB.listarArchivosDeCarpeta(carpetaActual);
                                System.out.println("#Ingrese el numero de archivo para descargar");
                                unaOpc = Integer.parseInt(ScriptDatosDB.getOpcion());
                                Archivo arch = listaArchivosDeCarpeta.get(unaOpc - 1);
                                if (!arch.isCarpeta()) {
                                    AppService.getInstance().getArchivoService().descargarArchivo("/Users/ivanpianetti/Desktop/", arch);
                                }
                                break;
                            }
                            case 8: {//Editar archivo
                                ScriptDatosDB.listarArchivosDeCarpeta(carpetaActual);
                                System.out.println("#Ingrese el numero de archivo para editar");
                                unaOpc = Integer.parseInt(ScriptDatosDB.getOpcion());
                                Archivo arch = listaArchivosDeCarpeta.get(unaOpc - 1);
                                System.out.println("#Ingrese el nuevo nombre para el archivo");
                                String nombre = ScriptDatosDB.getOpcion();
                                arch.setNombreArchivo(nombre);
                                AppService.getInstance().getArchivoService().update(arch);
                                break;
                            }
                            case 9: {//Listar Usuarios carpeta actual
                                ScriptDatosDB.listarUsariosDeCarpeta(carpetaActual);
                                break;
                            }
                            case 10: {//Salir de carpeta compartida
                                AppService.getInstance().getArchivoService().abandonarCarpetaCompartida(carpetaActual);
                                ScriptDatosDB.listarUsariosDeCarpeta(carpetaActual);
                                break;
                            }
                        }
                    } while (unaOpc != 0);
                    break;
                }
            }
        } catch (GeneralException ex) {
            System.out.println(ex.getMessage());
        }
        System.exit(0);
    }

    private static String getOpcion() {
        String unaOpc = "";
        try {
            BufferedReader opcion = new BufferedReader(new InputStreamReader(System.in));
            unaOpc = opcion.readLine();
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        return unaOpc;
    }

    public static void listarArchivosDeCarpeta(Archivo carpeta) {
        try {
            listaArchivosDeCarpeta = AppService.getInstance().getArchivoService().getAllByCarpeta(carpeta);
            System.out.println("    ->Listado de Archivos de la Carpeta: " + carpeta.getNombreArchivo() + " (" + listaArchivosDeCarpeta.size() + ")");
            int i = 1;
            for (Archivo arch : listaArchivosDeCarpeta) {
                System.out.println(i + " - " + arch.getTipoarchivo().getTipo() + " - " + arch.getNombreArchivo());
                i++;
            }
        } catch (GeneralException ex) {
            System.out.println(ex.getMessage());
        }
    }

    private static void listarUsariosDeCarpeta(Archivo carpeta) {
        try {
            List<Usuario> listaUsuariosDeCarpeta = AppService.getInstance().getUsuarioService().getAllByGrupo(carpeta.getGrupo());
            System.out.println("    ->Listado de Usuarios que poseen la carpeta: " + carpeta.getNombreArchivo() + " del Usuario " + UsuarioService.getUsuarioActual().getNombreUsuario());
            int i = 1;
            for (Usuario u : listaUsuariosDeCarpeta) {
                System.out.println(i + " - " + u.getNombreUsuario());
                i++;
            }
        } catch (GeneralException ex) {
            System.out.println(ex.getMessage());
        }
    }

    private static void listarUsuariosExistentes() {
        try {
            listaUsuariosExistentes = AppService.getInstance().getUsuarioService().getAll();
            int i = 1;
            System.out.println("#Usuarios Existentes");
            for (Usuario u : listaUsuariosExistentes) {
                System.out.println(i + "- " + u.getNombreUsuario());
                i++;
            }
        } catch (GeneralException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public static void cargarArchivos() {
        System.out.println("#Ingrese la cantidad de archivos que desea cargar al usuario " + usuarioActual.getNombreUsuario());
        System.out.println("=>");
        int cantidad = Integer.parseInt(ScriptDatosDB.getOpcion());
        for (int i = 0; i < cantidad; i++) {
            try {
                String filePath = ArchUtils.seleccionarArchivo();
                AppService.getInstance().getArchivoService().subirArchivo(filePath, carpetaActual);
            } catch (GeneralException ex) {
                System.out.println(ex.getMessage());
            }
        }
        System.out.println("Todos los datos fueron cargados correctamente!");
    }
}
